'use strict'

const Controller = require('egg').Controller
const Joi = require('@hapi/joi')
const _ = require('lodash')
const uuidv4 = require('uuid/v4')
const xlsx = require('xlsx')
const moment = require('moment')

class UtilsController extends Controller {
  // 创建默认试题
  async CreateDefaultQuestionTable() {
    const { ctx, service } = this
    const { questionTypes } = service
    const menus = [
      {
        id: '001',
        name: '注册考试',
        open_flag: 1,
        type: 3,
        desc: '注册考试',
        extraction_count: 7,
        is_random: 0,
        pass_line_count: 0,
      },
      {
        id: '002',
        name: '消分考试',
        open_flag: 1,
        type: 2,
        desc: '消分考试',
        extraction_count: 7,
        is_random: 1,
        pass_line_count: 0,
      },
    ]
    const result = await questionTypes.bulkCreate(menus)
    ctx.success(result)
  }
  // 创建默认数据
  async CreateDefaultTable() {
    const { ctx, service } = this
    const { userMenu } = service
    return
    // const menus = [
    //   {
    //     id: '01',
    //     label: '综合数据',
    //     pid: '0',
    //     path: 'total',
    //     sort: 0,
    //     icon: 'dashboard',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '02',
    //     label: '综合数据',
    //     pid: '01',
    //     path: 'total1',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '03',
    //     label: '企业单位管理',
    //     pid: '0',
    //     path: 'management',
    //     sort: 0,
    //     icon: 'apartment',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '04',
    //     label: '企业管理',
    //     pid: '03',
    //     path: 'company',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '05',
    //     label: '骑手管理',
    //     pid: '03',
    //     path: 'rider',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '06',
    //     label: '审核',
    //     pid: '0',
    //     path: 'check',
    //     sort: 0,
    //     icon: 'file-done',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '07',
    //     label: '入职审核',
    //     pid: '06',
    //     path: 'riderCheck',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '08',
    //     label: '审核员管理',
    //     pid: '06',
    //     path: 'companyAuditor',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '09',
    //     label: '车牌解绑申述',
    //     pid: '06',
    //     path: 'carUnbundCheck',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '10',
    //     label: '行驶证审核',
    //     pid: '06',
    //     path: 'licenseCheck',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '11',
    //     label: '违章申诉',
    //     pid: '06',
    //     path: 'wzAppeal',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '12',
    //     label: '黑名单解除',
    //     pid: '06',
    //     path: 'removeBlackList',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '13',
    //     label: '考试题库',
    //     pid: '0',
    //     path: 'question',
    //     sort: 0,
    //     icon: 'edit',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '14',
    //     label: '题目类型',
    //     pid: '13',
    //     path: 'classify',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '15',
    //     label: '考试题目',
    //     pid: '13',
    //     path: 'entering',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '16',
    //     label: '视频教学',
    //     pid: '13',
    //     path: 'teachingVideo',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '17',
    //     label: '违章',
    //     pid: '0',
    //     path: 'wz',
    //     sort: 0,
    //     icon: 'frown',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '18',
    //     label: '志愿者举报',
    //     pid: '17',
    //     path: 'wzReport',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '19',
    //     label: '违章列表',
    //     pid: '17',
    //     path: 'wzList',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '20',
    //     label: '企业车辆申请',
    //     pid: '06',
    //     path: 'enterpriseVehicleApplication',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    //   {
    //     id: '20',
    //     label: '企业车辆申请',
    //     pid: '06',
    //     path: 'enterpriseVehicleDetail',
    //     sort: 0,
    //     icon: '',
    //     is_hidden: 0,
    //   },
    // ]
    // const result = await userMenu.bulkCreate(menus)
    // ctx.success(result)
  }

  async upload() {
    const { ctx, app, service } = this
    const { rider, wzType } = service
    const { companyCom } = service.common
    const { Car, CarWz, Rider } = app.model
    try {
      const fileData = ctx.request.files[0]
      const workbook = xlsx.readFile(fileData.filepath, { cellDates: true })
      const sheetNames = workbook.SheetNames // 获取表名
      const sheet = workbook.Sheets[sheetNames[0]] // 通过表名得到表对象
      const sheet1 = { ...sheet, '!ref': 'A3:' + sheet['!ref'].split(':')[1] }
      const data = xlsx.utils.sheet_to_json(sheet1)
      if (!data[0] || Object.keys(data[0])[0] !== '违法时间') {
        throw '请上传正确的excel文件'
      }
      const list = []
      const promises = []
      for (let i = 0; i < data.length; i++) {
        // 查骑手
        const riderRes = await rider.findOne({
          where: { mobile: String(data[i]['电话号码']) },
          include: [{ model: Car }],
        })

        list.push({
          wz_num: ctx.helper.createSealNum(),
          wz_car_num: riderRes.car ? riderRes.car.car_num : '',
          rider_id: riderRes.id,
          company_id: riderRes.company_id,
          complaint_status: 0,
          source: 'cop',
          wz_type_id: data[i]['违法类型'],
          wz_address: data[i]['违法地点'],
          wz_desc: data[i]['违法描述'] ? data[i]['违法描述'] : '',
          wz_time: moment(data[i]['违法时间'])
            .add(1, 'days')
            .format('YYYY-MM-DD 08:00:00'),
        })

        // 骑手更新扣分
        const wzTypeRes = await wzType.findOne({ id: data[i]['违法类型'] })
        const riderData = ctx.helper.handleStatus(
          riderRes.wz_score,
          wzTypeRes.penalty_score
        )
        promises.push(
          await Rider.update(riderData, { where: { id: riderRes.id } })
        )
      }
      const bulkRes = await CarWz.bulkCreate(list, {
        validate: true,
      }).then(() => {
        Promise.all(promises)
      })
      ctx.success(bulkRes)
    } catch (error) {
      ctx.fail('导入出错')
    }
  }

  async uploadCar() {
    const { ctx, app, service } = this
    const { Car } = app.model
    try {
      const params = ctx.joi({
        company_id: Joi.string().required(),
      })
      const fileData = ctx.request.files[0]
      const workbook = xlsx.readFile(fileData.filepath, { cellDates: true })
      const sheetNames = workbook.SheetNames // 获取表名
      const sheet = workbook.Sheets[sheetNames[0]] // 通过表名得到表对象
      const data = xlsx.utils.sheet_to_json(sheet)
      if (!data[0] || Object.keys(data[0])[0] !== '车牌号码') {
        throw '请上传正确的excel文件'
      }
      const list = []
      for (let i = 0; i < data.length; i++) {
        // 查违章
        list.push({
          car_num: data[i]['车牌号码'],
          status: 0,
          car_mac: data[i]['车架号'],
          car_eng: data[i]['发动机号'],
          car_brand: data[i]['车辆品牌'],
          car_color: data[i]['车辆颜色'],
          company_id: params.company_id,
        })
      }
      const bulkRes = await Car.bulkCreate(list, {
        validate: true,
        // ignoreDuplicates: true   //忽略重复主键
        // updateOnDuplicate: ['car_mac']  // 重复组件更新指定字段
      })
      ctx.success(bulkRes)
    } catch (error) {
      ctx.fail('导入出错')
    }
  }
}

module.exports = UtilsController
